/*
 * Tulalip ORM Library, a port of the popular ORMLite library with extensions.
 * Copyright (C) 2012 Richard Schilling
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.j256.ormlite.android.apptools;

import android.app.TabActivity;
import android.content.Context;
import android.os.Bundle;

import com.j256.ormlite.support.ConnectionSource;

/**
 * Base class to use for Tab activities in Android. For more information, see
 * {@link OrmLiteBaseActivity}.
 * 
 * @author graywatson, kevingalligan
 */
public abstract class OrmLiteBaseTabActivity<H extends OrmLiteSqliteOpenHelper> extends TabActivity {

    private volatile H helper;
    private volatile boolean created = false;
    private volatile boolean destroyed = false;

    /**
     * Get a helper for this action.
     */
    public H getHelper() {
        if (helper == null) {
            if (!created) {
                throw new IllegalStateException(
                        "A call has not been made to onCreate() yet so the helper is null");
            } else if (destroyed) {
                throw new IllegalStateException(
                        "A call to onDestroy has already been made and the helper cannot be used after that point");
            } else {
                throw new IllegalStateException("Helper is null for some unknown reason");
            }
        } else {
            return helper;
        }
    }

    /**
     * Get a connection source for this action.
     */
    public ConnectionSource getConnectionSource() {
        return getHelper().getConnectionSource();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (helper == null) {
            helper = getHelperInternal(this);
            created = true;
        }
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseHelper(helper);
        destroyed = true;
    }

    /**
     * This is called internally by the class to populate the helper object
     * instance. This should not be called directly by client code unless you
     * know what you are doing. Use {@link #getHelper()} to get a helper
     * instance. If you are managing your own helper creation, override this
     * method to supply this activity with a helper instance.
     * <p>
     * <b> NOTE: </b> If you override this method, you most likely will need to
     * override the {@link #releaseHelper(OrmLiteSqliteOpenHelper)} method as
     * well.
     * </p>
     * 
     * @see OpenHelperManager#getHelper(Context)
     */
    protected H getHelperInternal(Context context) {
        @SuppressWarnings({ "unchecked", "deprecation" })
        H newHelper = (H) OpenHelperManager.getHelper(context);
        return newHelper;
    }

    /**
     * Release the helper instance created in
     * {@link #getHelperInternal(Context)}. You most likely will not need to
     * call this directly since {@link #onDestroy()} does it for you.
     * <p>
     * <b> NOTE: </b> If you override this method, you most likely will need to
     * override the {@link #getHelperInternal(Context)} method as well.
     * </p>
     */
    protected void releaseHelper(H helper) {
        OpenHelperManager.releaseHelper();
        this.helper = null;
    }
}
